home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / 68hc11 / fuzzy11a.arc / FUZZY11A.LST < prev   
File List  |  1991-12-04  |  34KB  |  508 lines

  1. M68HC11 Portable Cross Assembler  0.05   MS-DOS/PC-DOS  Page 1
  2.  Thu Oct 10 16:08:33 1991 
  3. Command line: 
  4.  d:\pasm\PASMHC11.EXE -l FUZZY11A.lst FUZZY11A.ASM
  5. Options list: 
  6. ON  - b - Printing of macro definitions
  7. ON  - c - Printing of macro calls
  8. OFF - d - Placing of symbolic debugging information in COFF
  9. ON  - e - Printing of macro expansions  (changed) 
  10. ON  - f - Printing of conditional directives
  11. OFF - g - Printing of generated constants list
  12. OFF - q - Expanding and printing of structured syntax
  13. OFF - s - Printing of symbol table
  14. OFF - u - Printing of conditional unassembled source
  15. OFF - x - Printing of cross reference table
  16. OFF - m - Suppress printing of error messages
  17. ON  - w - Printing of warning messages
  18. OFF - v - Suppress printing of updated status
  19. OFF - y - Enabling of sgs extensions
  20. ON  - o - Create object code
  21. ON  -   - Formatting of source line listing 
  22. Create listing file - l - FUZZY11A.lst 
  23.  
  24. Xdefs: 
  25.   NONE 
  26.  
  27. Xrefs: 
  28.   NONE 
  29.  
  30. Input file(s): FUZZY11A.ASM (241 lines) 
  31.  
  32. Output file: FUZZY11A.o  
  33. Listing file: FUZZY11A.lst 
  34.  
  35. M68HC11 Portable Cross Assembler  0.05  FUZZY11A.ASM  Page 2
  36.  Thu Oct 10 16:08:33 1991  
  37. Options - MD,MC,NOG,NOU,W,NOMEX,CL,FMT,O
  38.  
  39. LINE   S PC   OPCO OPERANDS  S LABEL    MNEMO OPERANDS COMMENT
  40. 00001                          *   Fuzzy Logic Inferrence Engine
  41. 00002                          *
  42. 00003                          *** Data structures and variables
  43. 00004                          *
  44. 00005                                   opt   mex      
  45. 00006  A 0000                           ORG   $0000    ;Beginning of HC11 RAM
  46. 00007  A 0000      08        A CURRENT_INS RMB 8       ;Storage for 8 8-bit inputs
  47. 00008  A 0008      20        A FUZ_OUTS RMB   32       ;Storage for fuzzy outputs
  48. 00009  A 0028      04        A COG_OUTS RMB   4        ;Defuzzified outputs
  49. 00010  A 002c      01        A LOWEST_IF RMB  1        ;Holds min grade of IF parts
  50. 00011  A 002d      02        A SUM_OF_FUZ RMB 2        ;11-bit sum of fuzzy outs
  51. 00012  A 002f      03        A SUM_OF_PROD RMB 3       ;19-bit sum of products
  52. 00013  A 0032      01        A COGDEX   RMB   1        ;Current out # for COG loop 0->4
  53. 00014  A 0033      01        A SUMDEX   RMB   1        ;Index for sum loop 8->0
  54. 00015                          
  55. 00016  A b600                           ORG   $B600    Beginning of HC11 EEPROM
  56. 00017  A b600      b610      A IN_MF_PTRS FDB IN0MF    ;Addr of MF data for input 0
  57. 00018  A b602      b618      A          FDB   IN1MF    ;Addr of MF data for input 1
  58. 00019  A b604      b61c      A          FDB   IN2MF    ;Addr of MF data for input 2
  59. 00020  A b606      b630      A          FDB   IN3MF    ;Addr of MF data for input 3
  60. 00021  A b608      b644      A          FDB   IN4MF    ;Addr of MF data for input 4
  61. 00022  A b60a      b644      A          FDB   IN5MF    ;Addr of MF data for input 5
  62. 00023  A b60c      b644      A          FDB   IN6MF    ;Addr of MF data for input 6
  63. 00024  A b60e      b644      A          FDB   IN7MF    ;Addr of MF data for input 7
  64. 00025                          *
  65. 00026                          * Input membership functions are defined by four 8-bit values per
  66. 00027                          * input label. Up to 8 labels per input so max size of MF data
  67. 00028                          * structure is 8*8*4=256 bytes. Unused labels take no space.
  68. 00029                          * Membership functions are trapezoids with the base greater than or
  69. 00030                          * equal to the top. Values are entered into this program as the
  70. 00031                          * X coordinates of 4 points but are stored as 2 points and 2 slopes.
  71. 00032                          * 
  72. 00033                          ***** MACRO Definition for input membership functions
  73. 00034                          *
  74. 00035         MACRO DEF        INMF     MACR           ;For input membership functions
  75. 00036                              FCB \0                      ;First inflection point
  76. 00037                              IFNE \1-\0                    ;Check for divide by zero
  77. 00038                               FCB    ($FF+((\1-\0)/3))/(\1-\0) ;If not, calc slope
  78. 00039                              ENDC
  79. 00040                              IFEQ \1-\0                    ;Check for divide by zero
  80. 00041                               FCB    $00                     ;Indicates vertical slope
  81. 00042                              ENDC
  82. 00043                              FCB \2                      ;Third inflection point
  83. 00044                              IFNE \3-\2                    ;Check for divide by zero
  84. 00045                               FCB    ($FF+((\3-\2)/3))/(\3-\2) ;If not, calc slope
  85. 00046                              ENDC
  86. 00047                              IFEQ \3-\2                    ;Check for divide by zero
  87. 00048                               FCB    $00                     ;Indicates vertical slope
  88. 00049                              ENDC
  89. 00050                                   ENDM           
  90. 00051                          *   
  91. 00052                          *****
  92.  
  93. M68HC11 Portable Cross Assembler  0.05  FUZZY11A.ASM  Page 3
  94.  Thu Oct 10 16:08:33 1991  
  95. Options - MD,MC,NOG,NOU,W,MEX,CL,FMT,O
  96.  
  97. LINE   S PC   OPCO OPERANDS  S LABEL    MNEMO OPERANDS COMMENT
  98. 00053  A b610      b610      A INPUT_MFS EQU  *        ;Input membership functions
  99. 00054                          
  100. 00055  A b610      b610      A IN0MF    EQU   *        ;(0) ROTATION
  101. 00056         MACRO INV                 INMF  0,0,0,8*4 ;  (0) STOPPED
  102. 00056 +A b610      00        A          FCB   0        ;First inflection point
  103. 00056 +                                 IFNE  0-0      ;Check for divide by zero
  104. 00056 +                                 ENDC           
  105. 00056 +                                 IFEQ  0-0      ;Check for divide by zero
  106. 00056 +A b611      00        A          FCB   $00      ;Indicates vertical slope
  107. 00056 +                                 ENDC           
  108. 00056 +A b612      00        A          FCB   0        ;Third inflection point
  109. 00056 +                                 IFNE  8*4-0    ;Check for divide by zero
  110. 00056 +A b613      08        A          FCB   ($FF+((8*4-0)/3))/(8*4-0) ;If not, calc slope
  111. 00056 +                                 ENDC           
  112. 00056 +                                 IFEQ  8*4-0    ;Check for divide by zero
  113. 00056 +                                 ENDC           
  114. 00056 +                        
  115. 00057         MACRO INV                 INMF  0,8*4,$FF,$FF ;  (1) NOT_STOPPED
  116. 00057 +A b614      00        A          FCB   0        ;First inflection point
  117. 00057 +                                 IFNE  8*4-0    ;Check for divide by zero
  118. 00057 +A b615      08        A          FCB   ($FF+((8*4-0)/3))/(8*4-0) ;If not, calc slope
  119. 00057 +                                 ENDC           
  120. 00057 +                                 IFEQ  8*4-0    ;Check for divide by zero
  121. 00057 +                                 ENDC           
  122. 00057 +A b616      ff        A          FCB   $FF      ;Third inflection point
  123. 00057 +                                 IFNE  $FF-$FF  ;Check for divide by zero
  124. 00057 +                                 ENDC           
  125. 00057 +                                 IFEQ  $FF-$FF  ;Check for divide by zero
  126. 00057 +A b617      00        A          FCB   $00      ;Indicates vertical slope
  127. 00057 +                                 ENDC           
  128. 00057 +                        
  129. 00058                          
  130. 00059  A b618      b618      A IN1MF    EQU   *        ;(1) EXAMPLE1
  131. 00060         MACRO INV                 INMF  $20,$40,$60,$A0 ;  (0) TEST1
  132. 00060 +A b618      20        A          FCB   $20      ;First inflection point
  133. 00060 +                                 IFNE  $40-$20  ;Check for divide by zero
  134. 00060 +A b619      08        A          FCB   ($FF+(($40-$20)/3))/($40-$20) ;If not, calc slope
  135. 00060 +                                 ENDC           
  136. 00060 +                                 IFEQ  $40-$20  ;Check for divide by zero
  137. 00060 +                                 ENDC           
  138. 00060 +A b61a      60        A          FCB   $60      ;Third inflection point
  139. 00060 +                                 IFNE  $A0-$60  ;Check for divide by zero
  140. 00060 +A b61b      04        A          FCB   ($FF+(($A0-$60)/3))/($A0-$60) ;If not, calc slope
  141. 00060 +                                 ENDC           
  142. 00060 +                                 IFEQ  $A0-$60  ;Check for divide by zero
  143. 00060 +                                 ENDC           
  144. 00060 +                        
  145. 00061                          
  146. 00062  A b61c      b61c      A IN2MF    EQU   *        ;(2) TEMPERATURE
  147. 00063         MACRO INV                 INMF  2*0,2*0,2*40,2*50 ;    (0) COLD
  148. 00063 +A b61c      00        A          FCB   2*0      ;First inflection point
  149. 00063 +                                 IFNE  2*0-2*0  ;Check for divide by zero
  150.  
  151. M68HC11 Portable Cross Assembler  0.05  FUZZY11A.ASM  Page 4
  152.  Thu Oct 10 16:08:33 1991  
  153. Options - MD,MC,NOG,NOU,W,MEX,CL,FMT,O
  154.  
  155. LINE   S PC   OPCO OPERANDS  S LABEL    MNEMO OPERANDS COMMENT
  156. 00063 +                                 ENDC           
  157. 00063 +                                 IFEQ  2*0-2*0  ;Check for divide by zero
  158. 00063 +A b61d      00        A          FCB   $00      ;Indicates vertical slope
  159. 00063 +                                 ENDC           
  160. 00063 +A b61e      50        A          FCB   2*40     ;Third inflection point
  161. 00063 +                                 IFNE  2*50-2*40 ;Check for divide by zero
  162. 00063 +A b61f      0d        A          FCB   ($FF+((2*50-2*40)/3))/(2*50-2*40) ;If not, calc slope
  163. 00063 +                                 ENDC           
  164. 00063 +                                 IFEQ  2*50-2*40 ;Check for divide by zero
  165. 00063 +                                 ENDC           
  166. 00063 +                        
  167. 00064         MACRO INV                 INMF  2*40,2*50,2*60,2*70 ;  (1) COOL
  168. 00064 +A b620      50        A          FCB   2*40     ;First inflection point
  169. 00064 +                                 IFNE  2*50-2*40 ;Check for divide by zero
  170. 00064 +A b621      0d        A          FCB   ($FF+((2*50-2*40)/3))/(2*50-2*40) ;If not, calc slope
  171. 00064 +                                 ENDC           
  172. 00064 +                                 IFEQ  2*50-2*40 ;Check for divide by zero
  173. 00064 +                                 ENDC           
  174. 00064 +A b622      78        A          FCB   2*60     ;Third inflection point
  175. 00064 +                                 IFNE  2*70-2*60 ;Check for divide by zero
  176. 00064 +A b623      0d        A          FCB   ($FF+((2*70-2*60)/3))/(2*70-2*60) ;If not, calc slope
  177. 00064 +                                 ENDC           
  178. 00064 +                                 IFEQ  2*70-2*60 ;Check for divide by zero
  179. 00064 +                                 ENDC           
  180. 00064 +                        
  181. 00065         MACRO INV                 INMF  2*60,2*70,2*80,2*90 ;  (2) WARM
  182. 00065 +A b624      78        A          FCB   2*60     ;First inflection point
  183. 00065 +                                 IFNE  2*70-2*60 ;Check for divide by zero
  184. 00065 +A b625      0d        A          FCB   ($FF+((2*70-2*60)/3))/(2*70-2*60) ;If not, calc slope
  185. 00065 +                                 ENDC           
  186. 00065 +                                 IFEQ  2*70-2*60 ;Check for divide by zero
  187. 00065 +                                 ENDC           
  188. 00065 +A b626      a0        A          FCB   2*80     ;Third inflection point
  189. 00065 +                                 IFNE  2*90-2*80 ;Check for divide by zero
  190. 00065 +A b627      0d        A          FCB   ($FF+((2*90-2*80)/3))/(2*90-2*80) ;If not, calc slope
  191. 00065 +                                 ENDC           
  192. 00065 +                                 IFEQ  2*90-2*80 ;Check for divide by zero
  193. 00065 +                                 ENDC           
  194. 00065 +                        
  195. 00066         MACRO INV                 INMF  2*80,2*90,2*95,2*110 ;  (3) HOT
  196. 00066 +A b628      a0        A          FCB   2*80     ;First inflection point
  197. 00066 +                                 IFNE  2*90-2*80 ;Check for divide by zero
  198. 00066 +A b629      0d        A          FCB   ($FF+((2*90-2*80)/3))/(2*90-2*80) ;If not, calc slope
  199. 00066 +                                 ENDC           
  200. 00066 +                                 IFEQ  2*90-2*80 ;Check for divide by zero
  201. 00066 +                                 ENDC           
  202. 00066 +A b62a      be        A          FCB   2*95     ;Third inflection point
  203. 00066 +                                 IFNE  2*110-2*95 ;Check for divide by zero
  204. 00066 +A b62b      08        A          FCB   ($FF+((2*110-2*95)/3))/(2*110-2*95) ;If not, calc slope
  205. 00066 +                                 ENDC           
  206. 00066 +                                 IFEQ  2*110-2*95 ;Check for divide by zero
  207. 00066 +                                 ENDC           
  208.  
  209. M68HC11 Portable Cross Assembler  0.05  FUZZY11A.ASM  Page 5
  210.  Thu Oct 10 16:08:33 1991  
  211. Options - MD,MC,NOG,NOU,W,MEX,CL,FMT,O
  212.  
  213. LINE   S PC   OPCO OPERANDS  S LABEL    MNEMO OPERANDS COMMENT
  214. 00066 +                        
  215. 00067         MACRO INV                 INMF  2*90,2*110,$FF,$FF ;  (4) VERY_HOT
  216. 00067 +A b62c      b4        A          FCB   2*90     ;First inflection point
  217. 00067 +                                 IFNE  2*110-2*90 ;Check for divide by zero
  218. 00067 +A b62d      06        A          FCB   ($FF+((2*110-2*90)/3))/(2*110-2*90) ;If not, calc slope
  219. 00067 +                                 ENDC           
  220. 00067 +                                 IFEQ  2*110-2*90 ;Check for divide by zero
  221. 00067 +                                 ENDC           
  222. 00067 +A b62e      ff        A          FCB   $FF      ;Third inflection point
  223. 00067 +                                 IFNE  $FF-$FF  ;Check for divide by zero
  224. 00067 +                                 ENDC           
  225. 00067 +                                 IFEQ  $FF-$FF  ;Check for divide by zero
  226. 00067 +A b62f      00        A          FCB   $00      ;Indicates vertical slope
  227. 00067 +                                 ENDC           
  228. 00067 +                        
  229. 00068                          
  230. 00069  A b630      b630      A IN3MF    EQU   *        ;(3) DAYS_SINCE_RAIN
  231. 00070         MACRO INV                 INMF  $00,$00,$00,$08 ;    (0) NONE
  232. 00070 +A b630      00        A          FCB   $00      ;First inflection point
  233. 00070 +                                 IFNE  $00-$00  ;Check for divide by zero
  234. 00070 +                                 ENDC           
  235. 00070 +                                 IFEQ  $00-$00  ;Check for divide by zero
  236. 00070 +A b631      00        A          FCB   $00      ;Indicates vertical slope
  237. 00070 +                                 ENDC           
  238. 00070 +A b632      00        A          FCB   $00      ;Third inflection point
  239. 00070 +                                 IFNE  $08-$00  ;Check for divide by zero
  240. 00070 +A b633      20        A          FCB   ($FF+(($08-$00)/3))/($08-$00) ;If not, calc slope
  241. 00070 +                                 ENDC           
  242. 00070 +                                 IFEQ  $08-$00  ;Check for divide by zero
  243. 00070 +                                 ENDC           
  244. 00070 +                        
  245. 00071         MACRO INV                 INMF  $00,$10,$10,$18 ;    (1) SHORT
  246. 00071 +A b634      00        A          FCB   $00      ;First inflection point
  247. 00071 +                                 IFNE  $10-$00  ;Check for divide by zero
  248. 00071 +A b635      10        A          FCB   ($FF+(($10-$00)/3))/($10-$00) ;If not, calc slope
  249. 00071 +                                 ENDC           
  250. 00071 +                                 IFEQ  $10-$00  ;Check for divide by zero
  251. 00071 +                                 ENDC           
  252. 00071 +A b636      10        A          FCB   $10      ;Third inflection point
  253. 00071 +                                 IFNE  $18-$10  ;Check for divide by zero
  254. 00071 +A b637      20        A          FCB   ($FF+(($18-$10)/3))/($18-$10) ;If not, calc slope
  255. 00071 +                                 ENDC           
  256. 00071 +                                 IFEQ  $18-$10  ;Check for divide by zero
  257. 00071 +                                 ENDC           
  258. 00071 +                        
  259. 00072         MACRO INV                 INMF  $10,$20,$28,$40 ;    (2) MEDIUM
  260. 00072 +A b638      10        A          FCB   $10      ;First inflection point
  261. 00072 +                                 IFNE  $20-$10  ;Check for divide by zero
  262. 00072 +A b639      10        A          FCB   ($FF+(($20-$10)/3))/($20-$10) ;If not, calc slope
  263. 00072 +                                 ENDC           
  264. 00072 +                                 IFEQ  $20-$10  ;Check for divide by zero
  265. 00072 +                                 ENDC           
  266.  
  267. M68HC11 Portable Cross Assembler  0.05  FUZZY11A.ASM  Page 6
  268.  Thu Oct 10 16:08:33 1991  
  269. Options - MD,MC,NOG,NOU,W,MEX,CL,FMT,O
  270.  
  271. LINE   S PC   OPCO OPERANDS  S LABEL    MNEMO OPERANDS COMMENT
  272. 00072 +A b63a      28        A          FCB   $28      ;Third inflection point
  273. 00072 +                                 IFNE  $40-$28  ;Check for divide by zero
  274. 00072 +A b63b      0a        A          FCB   ($FF+(($40-$28)/3))/($40-$28) ;If not, calc slope
  275. 00072 +                                 ENDC           
  276. 00072 +                                 IFEQ  $40-$28  ;Check for divide by zero
  277. 00072 +                                 ENDC           
  278. 00072 +                        
  279. 00073         MACRO INV                 INMF  $30,$40,$50,$60 ;    (3) LONG
  280. 00073 +A b63c      30        A          FCB   $30      ;First inflection point
  281. 00073 +                                 IFNE  $40-$30  ;Check for divide by zero
  282. 00073 +A b63d      10        A          FCB   ($FF+(($40-$30)/3))/($40-$30) ;If not, calc slope
  283. 00073 +                                 ENDC           
  284. 00073 +                                 IFEQ  $40-$30  ;Check for divide by zero
  285. 00073 +                                 ENDC           
  286. 00073 +A b63e      50        A          FCB   $50      ;Third inflection point
  287. 00073 +                                 IFNE  $60-$50  ;Check for divide by zero
  288. 00073 +A b63f      10        A          FCB   ($FF+(($60-$50)/3))/($60-$50) ;If not, calc slope
  289. 00073 +                                 ENDC           
  290. 00073 +                                 IFEQ  $60-$50  ;Check for divide by zero
  291. 00073 +                                 ENDC           
  292. 00073 +                        
  293. 00074         MACRO INV                 INMF  $50,$70,$FF,$FF ;    (4) VERY_LONG
  294. 00074 +A b640      50        A          FCB   $50      ;First inflection point
  295. 00074 +                                 IFNE  $70-$50  ;Check for divide by zero
  296. 00074 +A b641      08        A          FCB   ($FF+(($70-$50)/3))/($70-$50) ;If not, calc slope
  297. 00074 +                                 ENDC           
  298. 00074 +                                 IFEQ  $70-$50  ;Check for divide by zero
  299. 00074 +                                 ENDC           
  300. 00074 +A b642      ff        A          FCB   $FF      ;Third inflection point
  301. 00074 +                                 IFNE  $FF-$FF  ;Check for divide by zero
  302. 00074 +                                 ENDC           
  303. 00074 +                                 IFEQ  $FF-$FF  ;Check for divide by zero
  304. 00074 +A b643      00        A          FCB   $00      ;Indicates vertical slope
  305. 00074 +                                 ENDC           
  306. 00074 +                        
  307. 00075                          
  308. 00076  A b644      b644      A IN4MF    EQU   *        ;Not used
  309. 00077  A b644      b644      A IN5MF    EQU   *        ;Not used
  310. 00078  A b644      b644      A IN6MF    EQU   *        ;Not used
  311. 00079  A b644      b644      A IN7MF    EQU   *        ;Not used
  312. 00080                          
  313. 00081  A b644      b644      A SGLTN_POS EQU  *        ;Output singleton positions
  314. 00082  A b644      b644      A OUT0MF   EQU   *        ;(0) WATERING_TIME
  315. 00083  A b644      00        A          FCB   $00      ;(0) CUT_OFF
  316. 00084  A b645      10        A          FCB   $10      ;(1) DECREASE_GREATLY
  317. 00085  A b646      40        A          FCB   $40      ;(2) DECREASE
  318. 00086  A b647      80        A          FCB   $80      ;(3) NORMAL
  319. 00087  A b648      b0        A          FCB   $B0      ;(4) INCREASE
  320. 00088  A b649      f0        A          FCB   $F0      ;(5) INCREASE_GREATLY
  321. 00089  A b64a      0000      A          FCB   0,0      ;Unused; Must fill 8 per output
  322. 00090  A b64c      0000000000A OUT1MF   FCB   0,0,0,0,0,0,0,0 ;Not used
  323. 00091  A b654      0000000000A OUT2MF   FCB   0,0,0,0,0,0,0,0 ;Not used
  324.  
  325. M68HC11 Portable Cross Assembler  0.05  FUZZY11A.ASM  Page 7
  326.  Thu Oct 10 16:08:33 1991  
  327. Options - MD,MC,NOG,NOU,W,MEX,CL,FMT,O
  328.  
  329. LINE   S PC   OPCO OPERANDS  S LABEL    MNEMO OPERANDS COMMENT
  330. 00092  A b65c      0000000000A OUT3MF   FCB   0,0,0,0,0,0,0,0 ;Not used
  331. 00093                          *
  332. 00094                          * Each If part is of the form 00AA AXXX where AAA is a label (0-7)
  333. 00095                          * and XXX is an input (0-7). If parts are connected by ANDs. A rule
  334. 00096                          * may have any number of if parts (usually 2-8). Then parts are of
  335. 00097                          * the form 100Y YCCC where the MSB set indicates a then part, YY is
  336. 00098                          * the output number (0-3), and CCC is the output label (singleton
  337. 00099                          * 0-7). A rule may have any number of then parts (usually 1 or 2).
  338. 00100                          * A $FF indicates the end of a series of rules (number not limited).
  339. 00101                          *  
  340. 00102                          *   FCB INx + 8*LABa    ;If input XXX is label AAA
  341. 00103                          *   FCB $80+8*OUTy+LABc ;Then output YY is label CCC
  342. 00104                          
  343. 00105  A b664      b664      A RULE_START EQU *        ;Start of first rule
  344. 00106                          * Example rule: If TEMPERATURE is VERY_HOT and DAYS_SINCE_RAIN is LONG
  345. 00107                          * Then WATERING_TIME is INCREASE_GREATLY
  346. 00108  A b664      221b85    A RULE_1   FCB   2+(8*4),3+(8*3),$80+(8*0)+5
  347. 00109  A b667      ff        A END_OF_RULE FCB $FF     
  348. 00110                          
  349. 00111                          ***** Fuzzy Inferrence Engine Starts Here
  350. 00112                          *
  351. 00113  A b66b                           ORG   $B66B    
  352. 00114  A b66b ce   0008      A INFER_TOP LDX  #FUZ_OUTS ;Point at first fuzzy output
  353. 00115  A b66e 86   20        A          LDAA  #32      ;32 fuzzy outputs
  354. 00116  A b670 6f   00        A CLR_OUTS CLR   0,X      ;Clear a fuzzy output
  355. 00117  A b672 08                        INX            ;Point at next
  356. 00118  A b673 4a                        DECA           ;Loop index
  357. 00119  A b674 26   fa     b670          BNE   CLR_OUTS ;Continue till all fuzzy outs 0
  358. 00120  A b676 18ce b664      A          LDY   #RULE_START ;Point to start of 1st rule
  359. 00121  A b67a 86   ff        A RULE_TOP LDAA  #$FF     ;Begin processing rule string
  360. 00122  A b67c 97   2c        A          STAA  LOWEST_IF ;Will hold grade of min if part
  361. 00123  A b67e 18e6 00        A IF_LOOP  LDAB  0,Y      ;Get rule byte 00AA AXXX; If X is A
  362. 00124  A b681 2b   63     b6e6          BMI   THEN_LOOP ;If MSB=1, exit to then loop
  363. 00125  A b683 ce   0000      A          LDX   #CURRENT_INS ;Point at current input data area
  364. 00126  A b686 c4   07        A          ANDB  #$07     ;Save only input number
  365. 00127  A b688 37                        PSHB           ;Will need input # again
  366. 00128  A b689 3a                        ABX            ;Point to specific input data
  367. 00129  A b68a a6   00        A          LDAA  0,X      ;Get current input data
  368. 00130  A b68c ce   b600      A          LDX   #IN_MF_PTRS ;Point at offsets for input MFs
  369. 00131  A b68f 33                        PULB           ;Recover input number 0000 0XXX
  370. 00132  A b690 3a                        ABX            ;Point at pointer for this input #
  371. 00133  A b691 ee   00        A          LDX   0,X      ;Get pointer into MF data area
  372. 00134  A b693 18e6 00        A          LDAB  0,Y      ;Get rule if part 00AA AXXX
  373. 00135  A b696 c4   38        A          ANDB  #$38     ;00AA A000 is 8 times AAA
  374. 00136  A b698 54                        LSRB           ;000A AA00 4 times AAA
  375. 00137  A b699 3a                        ABX            ;X points at MF points & slopes
  376. 00138  A b69a a1   00        A          CMPA  0,X      ;Compare input data to MF pt1
  377. 00139  A b69c 24   03     b6a1          BHS   NOT_SEG0 ;Branch if not segment zero
  378. 00140  A b69e 5f                        CLRB           ;In seg 0 grade is zero
  379. 00141  A b69f 20   25     b6c6          BRA   HAVE_GRADE ;Have grade of membership
  380. 00142  A b6a1 a1   02        A NOT_SEG0 CMPA  2,X      ;Compare input data to MF pt2
  381. 00143  A b6a3 22   11     b6b6          BHI   IS_SEG2  ;Branch if segment two
  382.  
  383. M68HC11 Portable Cross Assembler  0.05  FUZZY11A.ASM  Page 8
  384.  Thu Oct 10 16:08:33 1991  
  385. Options - MD,MC,NOG,NOU,W,MEX,CL,FMT,O
  386.  
  387. LINE   S PC   OPCO OPERANDS  S LABEL    MNEMO OPERANDS COMMENT
  388. 00144  A b6a5 e6   01        A          LDAB  1,X      ;Slope1 -> B
  389. 00145  A b6a7 27   09     b6b2          BEQ   JAM_FF   ;If vert slope, jam $FF
  390. 00146  A b6a9 a0   00        A          SUBA  0,X      ;Input value - pt1 -> A
  391. 00147  A b6ab 3d                        MUL            ;Grade in B if D < $100
  392. 00148  A b6ac 1a83 0100      A          CPD   #$100    ;Check for overflow
  393. 00149  A b6b0 25   14     b6c6          BLO   HAVE_GRADE ;If < $100 grade OK in B
  394. 00150  A b6b2 c6   ff        A JAM_FF   LDAB  #$FF     ;Else limit B to $FF
  395. 00151  A b6b4 20   10     b6c6          BRA   HAVE_GRADE ;Have grade of membership
  396. 00152  A b6b6 e6   03        A IS_SEG2  LDAB  3,X      ;Slope2 -> B
  397. 00153  A b6b8 a0   02        A          SUBA  2,X      ;Input value - pt2 -> A
  398. 00154  A b6ba 3d                        MUL            ;Grade in B if D < $100
  399. 00155  A b6bb 1a83 0100      A          CPD   #$100    ;Check for overflow
  400. 00156  A b6bf 25   02     b6c3          BLO   B_OK     ;If < $100 value in B OK
  401. 00157  A b6c1 c6   ff        A          LDAB  #$FF     ;Else limit B to $FF
  402. 00158  A b6c3 86   ff        A B_OK     LDAA  #$FF     ;Grade should be $FF - (B)
  403. 00159  A b6c5 10                        SBA            ;Grade of membership in B
  404. 00160  A b6c6 d1   2c        A HAVE_GRADE CMPB LOWEST_IF ;Is grade lowest so far ?
  405. 00161  A b6c8 24   18     b6e2          BHS   NOT_LOWR ;Branch if not lower
  406. 00162  A b6ca d7   2c        A          STAB  LOWEST_IF ;If lower, replace lowest if
  407. 00163  A b6cc 26   14     b6e2          BNE   NOT_LOWR ;Skip ahead if not zero
  408. 00164  A b6ce 1808             FIND_THEN INY           ;Adv rule pointer to then part
  409. 00165  A b6d0 18e6 00        A          LDAB  0,Y      ;Get next rule byte
  410. 00166  A b6d3 2a   f9     b6ce          BPL   FIND_THEN ;MSB set means its a then part
  411. 00167  A b6d5 1808             FIND_IF  INY            ;Adv rule pointer to if part
  412. 00168  A b6d7 18e6 00        A          LDAB  0,Y      ;Get next rule byte
  413. 00169  A b6da 2a   9e     b67a          BPL   RULE_TOP ;MSB clear means its an if part
  414. 00170  A b6dc c1   ff        A          CMPB  #$FF     ;$FF is no more rules marker
  415. 00171  A b6de 26   f5     b6d5          BNE   FIND_IF  ;Continue looking for if or $FF
  416. 00172  A b6e0 20   20     b702          BRA   DEFUZ    ;When all rules done, go defuzzify
  417. 00173  A b6e2 1808             NOT_LOWR INY            ;Point to next rule byte
  418. 00174  A b6e4 20   98     b67e          BRA   IF_LOOP  ;Continue for all if parts
  419. 00175  A b6e6 ce   0008      A THEN_LOOP LDX  #FUZ_OUTS ;Point at fuzzy outputs
  420. 00176  A b6e9 c4   1f        A          ANDB  #$1F     ;Save 8 times out # + label #
  421. 00177  A b6eb 3a                        ABX            ;X points at fuzzy output
  422. 00178  A b6ec 96   2c        A          LDAA  LOWEST_IF ;Grade of membership for rule
  423. 00179  A b6ee a1   00        A          CMPA  0,X      ;Compare to fuzzy output
  424. 00180  A b6f0 25   02     b6f4          BLO   NOT_HIER ;Branch if not higher
  425. 00181  A b6f2 a7   00        A          STAA  0,X      ;Grade is higher so update
  426. 00182  A b6f4 1808             NOT_HIER INY            ;Point to next rule byte
  427. 00183  A b6f6 18e6 00        A          LDAB  0,Y      ;Get rule byte
  428. 00184  A b6f9 2b   03     b6fe          BMI   CHK_END  ;If MSB=0 its a new rule
  429. 00185  A b6fb 7e   b67a      A          JMP   RULE_TOP ;Else process next rule byte
  430. 00186  A b6fe c1   ff        A CHK_END  CMPB  #$FF     ;Check for end of rules flag
  431. 00187  A b700 26   e4     b6e6          BNE   THEN_LOOP ;If not $FF, must be a then part
  432. 00188  A b702 18ce b644      A DEFUZ    LDY   #SGLTN_POS ;Point at 1st output singleton
  433. 00189  A b706 ce   0008      A          LDX   #FUZ_OUTS ;Point at 1st fuzzy output
  434. 00190  A b709 7f   0032      A          CLR   COGDEX   ;Loop index will run from 0->4
  435. 00191  A b70c c6   08        A COG_LOOP LDAB  #8       ;8 fuzzy outs per COG output
  436. 00192  A b70e d7   33        A          STAB  SUMDEX   ;Inner loop runs 8->0
  437. 00193  A b710 cc   0000      A          LDD   #$0000   ;Used for quicker clears
  438. 00194  A b713 dd   2d        A          STD   SUM_OF_FUZ ;Sum of fuzzy outputs
  439. 00195  A b715 dd   30        A          STD   SUM_OF_PROD+1 ;Low 16-bits of sum of products
  440.  
  441. M68HC11 Portable Cross Assembler  0.05  FUZZY11A.ASM  Page 9
  442.  Thu Oct 10 16:08:33 1991  
  443. Options - MD,MC,NOG,NOU,W,MEX,CL,FMT,O
  444.  
  445. LINE   S PC   OPCO OPERANDS  S LABEL    MNEMO OPERANDS COMMENT
  446. 00196  A b717 97   2f        A          STAA  SUM_OF_PROD ;Upper 8-bits
  447. 00197  A b719 e6   00        A SUM_LOOP LDAB  0,X      ;Get a fuzzy output
  448. 00198  A b71b 4f                        CLRA           ;Clear upper 8-bits
  449. 00199  A b71c d3   2d        A          ADDD  SUM_OF_FUZ ;Add to sum of fuzzy outputs
  450. 00200  A b71e dd   2d        A          STD   SUM_OF_FUZ ;Update RAM variable
  451. 00201  A b720 a6   00        A          LDAA  0,X      ;Get fuzzy output again
  452. 00202  A b722 18e6 00        A          LDAB  0,Y      ;Get Output singleton position
  453. 00203  A b725 3d                        MUL            ;Position times weight
  454. 00204  A b726 d3   30        A          ADDD  SUM_OF_PROD+1 ;Low 16-bits of sum of products
  455. 00205  A b728 dd   30        A          STD   SUM_OF_PROD+1 ;Update low 16-bits
  456. 00206  A b72a 96   2f        A          LDAA  SUM_OF_PROD ;Upper 8-bits
  457. 00207  A b72c 89   00        A          ADCA  #0       ;Add carry from 16-bit add
  458. 00208  A b72e 97   2f        A          STAA  SUM_OF_PROD ;Upper 8-bits of 24-bit sum
  459. 00209  A b730 1808                      INY            ;Point at next singleton pos.
  460. 00210  A b732 08                        INX            ;Point at next fuzzy output
  461. 00211  A b733 7a   0033      A          DEC   SUMDEX   ;Inner loop index
  462. 00212  A b736 26   e1     b719          BNE   SUM_LOOP ;For all labels this output
  463. 00213  A b738 3c                        PSHX           ;Save index for now
  464. 00214  A b739 4f                        CLRA           ;In case divide by zero
  465. 00215  A b73a de   2d        A          LDX   SUM_OF_FUZ ;Demominator for divide
  466. 00216  A b73c 27   18     b756          BEQ   SAV_OUT  ;Branch if denominator is 0
  467. 00217  A b73e 7d   002f      A          TST   SUM_OF_PROD ;See if more than 16-bit
  468. 00218  A b741 26   07     b74a          BNE   NUM_BIG  ;If not zero, # is > 16-bits
  469. 00219  A b743 dc   30        A          LDD   SUM_OF_PROD+1 ;Numerator for divide
  470. 00220  A b745 02                        IDIV           ;Result in low 8-bits of X
  471. 00221  A b746 8f                        XGDX           ;Result now in B
  472. 00222  A b747 17                        TBA            ;Move result to A
  473. 00223  A b748 20   0c     b756          BRA   SAV_OUT  ;Go save output
  474. 00224  A b74a dc   2f        A NUM_BIG  LDD   SUM_OF_PROD ;Numerator upper 16 of 24-bit
  475. 00225  A b74c 7d   0031      A          TST   SUM_OF_PROD+2 ;Check for rounding error
  476. 00226  A b74f 2a   03     b754          BPL   NO_ROUND ;If MSB clear, don't round
  477. 00227  A b751 c3   0001      A          ADDD  #1       ;Round numerator up 1
  478. 00228  A b754 03               NO_ROUND FDIV           ;D/X -> X, use upper 8 of 16
  479. 00229  A b755 8f                        XGDX           ;Result now in A
  480. 00230  A b756 ce   0028      A SAV_OUT  LDX   #COG_OUTS ;Point to 1st defuz output
  481. 00231  A b759 d6   32        A          LDAB  COGDEX   ;Curent output number
  482. 00232  A b75b 3a                        ABX            ;Point to correct output
  483. 00233  A b75c a7   00        A          STAA  0,X      ;Update defuzzified output
  484. 00234  A b75e 38                        PULX           ;Recover index
  485. 00235  A b75f 5c                        INCB           ;Increment loop index
  486. 00236  A b760 d7   32        A          STAB  COGDEX   ;Update
  487. 00237  A b762 c1   04        A          CMPB  #4       ;Done with all four outs?
  488. 00238  A b764 26   a6     b70c          BNE   COG_LOOP ;If not, continue loop
  489. 00239                          
  490. 00240                          * Inference engine has completed one pass of all rules.
  491. 00241                          
  492. ***** warning  24: END statement is missing 
  493.  
  494. M68HC11 Portable Cross Assembler  0.05     Page 10
  495.  Thu Oct 10 16:08:33 1991  
  496.  
  497.  
  498.  
  499. Total number of errors: 0 
  500. Total number of warnings: 1 
  501. Total number of lines: 241 
  502.  
  503.  
  504. Number of bytes in section ASCT: 407 
  505.  
  506. Number of bytes in program: 407
  507.  
  508.